package main

import (
	"sync"
	"fmt"
	"time"
)

/*
只读模式:多路只读(不可写)
只写模式:单路只写(不可读)
*/

//声明全局读写锁
var rwm sync.RWMutex
var wg07 sync.WaitGroup

func main071() {
	var rwMutex sync.RWMutex

	//锁定为只读模式(可以多路锁定)
	rwMutex.RLock()
	//解锁只读模式
	rwMutex.RUnlock()

	//锁定为只写模式(只有一路能锁定)
	rwMutex.Lock()
	//解锁只写模式
	rwMutex.Unlock()

}

func main() {
	for i := 0; i < 5; i++ {
		wg07.Add(1)
		go read(i)

		wg07.Add(1)
		go write(i)
	}
	
	//time.Sleep(15*time.Second)
	wg07.Wait()
}

func read(i int) {

	//锁定为只读模式(多路只读,不可写)
	//应正确理解"多路",具备并发读的能力,但并不一定所有的读协程都能同一时间抢到锁
	rwm.RLock()

	fmt.Println(i, "reading...")
	<-time.After(10 * time.Second)
	fmt.Println(i, "read over!")

	//解锁只读模式
	rwm.RUnlock()
	wg07.Done()
}

func write(i int) {

	//锁定为只写模式(全局只有当前一条协程能写,其余协程无论读写都被阻塞)
	rwm.Lock()

	fmt.Println(i, "writing...")
	<-time.After(10 * time.Second)
	fmt.Println(i, "write over!")

	//解锁只读模式,引起其它协程(不分读写)对锁的哄抢
	rwm.Unlock()
	wg07.Done()
}
